package com.ruoyi.common.utils;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class MyDateUtils {
    private static final Logger log = LoggerFactory.getLogger(MyDateUtils.class);

    /**
     * 方法在使用
     * @param dateTime 格式如：2023-03-10 14:59:00
     * @return
     */
    public static String[] getHourDayMonth(DateTime dateTime){
        String format = DateUtil.format(dateTime, "yyyy-MM-dd HH:mm:ss");//dateTime的值如：2023-01-10 12:00:27（12:00:27触发定时任务）,或者2023-01-10 11:59:27（11:59:27触发定时任务），或者2023-01-10 12:00:00（12:00:00正常触发定时任务）
        String currentHour = format.substring(0,format.length() - 5) + "00:00";//假设当前小时该值，后面需要修正。值如：2023-01-10 12:00:00,或者2023-01-10 11:00:00,或者2023-01-10 12:00:00。对于2023-01-10 11:00:00就属于异常时间，需要修正
        String minute = format.substring(14,16);//取出分钟
        String hour = format.substring(11,13);//取出分钟
        String preHour = DateUtil.format(DateUtil.offsetHour(dateTime, -1), "yyyy-MM-dd HH")+":00:00";//如：2023-03-08 16:00:00
        String afterHour = DateUtil.format(DateUtil.offsetHour(dateTime, 1), "yyyy-MM-dd HH")+":00:00";//假设后一个小时是这样取值，正常情况是，准点触发任务，当前时间就是2023-01-10 13:00:00，后一个小时就是2023-01-10 14:00:00
        String preDay = DateUtil.format(DateUtil.offsetDay(dateTime, -1), "yyyy-MM-dd")+" 00:00:00";
        String currentDay = DateUtil.format(DateUtil.offsetDay(dateTime, 0), "yyyy-MM-dd")+" 00:00:00";
        String afterDay = DateUtil.format(DateUtil.offsetDay(dateTime, 1), "yyyy-MM-dd")+" 00:00:00";
        String preMonth = DateUtil.format(DateUtil.offsetMonth(dateTime, -1), "yyyy-MM")+"-01 00:00:00";
        String currenMonth = DateUtil.format(DateUtil.offsetMonth(dateTime, 0), "yyyy-MM")+"-01 00:00:00";
        String afterMonth = DateUtil.format(DateUtil.offsetMonth(dateTime, 1), "yyyy-MM")+"-01 00:00:00";
        try{
            //解决1小时附近的时间，
            // 如2023-01-10 12:59:27、2023-01-10 13:01:27触发，那么数据库中存储就会是2023-01-10 12:59:00，2023-01-10 13:01:00，不严格，应该是2023-01-10 13:00:00比较好处理
            int minuteInt = Integer.parseInt(minute);
            if(minuteInt >= 0 && minuteInt < 5){
                preHour = DateUtil.format(DateUtil.offsetHour(dateTime, -1), "yyyy-MM-dd HH")+":00:00";//
                currentHour = DateUtil.format(DateUtil.offsetHour(dateTime, 0), "yyyy-MM-dd HH")+":00:00";//当前小时，dateTime的值如2023-01-10 13:01:27，那么当前小时就是2023-01-10 13:00:00
                afterHour = DateUtil.format(DateUtil.offsetHour(dateTime, 1), "yyyy-MM-dd HH")+":00:00";//
            }else if(minuteInt >= 56 && minuteInt <= 59){
                preHour = DateUtil.format(DateUtil.offsetHour(dateTime, 0), "yyyy-MM-dd HH")+":00:00";//使用当前小时作为前一个小时
                currentHour = DateUtil.format(DateUtil.offsetHour(dateTime, 1), "yyyy-MM-dd HH")+":00:00";//使用后一个小时作为当前小时，比如2023-01-10 12:59:00触发了，应该算是2023-01-10 13:00:00触发。但2023-01-10 12:59:00的当前小时为2023-01-10 12:00:00，需要小时+1
                afterHour = DateUtil.format(DateUtil.offsetHour(dateTime, 2), "yyyy-MM-dd HH")+":00:00";//使用后2个小时作为后一个小时
                int hourInt = Integer.parseInt(hour);
                if(hourInt == 23){
                    //表示在yyyy-MM-dd 23:56:00到yyyy-MM-dd 23:59:59之间触发了任务，不是整点的yyyy-MM-dd 23:00:00、yyyy-MM-dd 00:00:00、yyyy-MM-dd 20:00:00，则时间需要向后取整点
                    preDay = DateUtil.format(DateUtil.offsetDay(dateTime, 0), "yyyy-MM-dd")+" 00:00:00";
                    currentDay = DateUtil.format(DateUtil.offsetDay(dateTime, 1), "yyyy-MM-dd")+" 00:00:00";
                    afterDay = DateUtil.format(DateUtil.offsetDay(dateTime, 2), "yyyy-MM-dd")+" 00:00:00";

                    preMonth = preDay.substring(0,7) + "-01 00:00:00";//对于月份拼接方式比较准
                    currenMonth = currentDay.substring(0,7) + "-01 00:00:00";//对于月份拼接方式比较准
                    afterMonth = afterDay.substring(0,7) +"-01 00:00:00";//对于月份拼接方式比较准
                }else{
                    //定时任务不应该误差大于1小时，因此，其它小时点 应该不存在
                }
            }else{
                //应该不存在这种情况，如果出现是时钟或者定时器出现问题，因为定时器每1小时执行一次，触发时间前后延时在1秒内才处理。
            }
        }catch (Exception e){
            e.printStackTrace();
            log.error("createEnergyOneHour Exception of Integer.parseInt",e);
        }
        String[] hourArray = new String[9];
        hourArray[0] = preHour;
        hourArray[1] = currentHour;
        hourArray[2] = afterHour;
        hourArray[3] = preDay;
        hourArray[4] = currentDay;
        hourArray[5] = afterDay;
        hourArray[6] = preMonth;
        hourArray[7] = currenMonth;
        hourArray[8] = afterMonth;
        return hourArray;
    }

    public static int getDaysByYearMonthStr(String date,String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Calendar calendar = new GregorianCalendar();
        Date date1 = null;
        try {
            date1 = sdf.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        calendar.setTime(date1); //放入你的日期
        int day=calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        return day;
    }
}
